package pck_tramitedocu.pck_src.pck_business;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.jasperreports.engine.JasperPrint;
import pck_tramitedocu.pck_src.pck_dao.Itf_dao_documento;
import pck_tramitedocu.pck_src.pck_pojos.*;
import pck_tramitedocu.pck_src.pck_utiles.*;
import pck_tramitedocu.pck_src.pck_utiles.enums.TipoOperacionDocumentoEnum;

public class Cls_business_documento implements Itf_business_documento {

    private Itf_dao_documento daoDocumentoInterface; 

    public void setDaoDocumentoInterface(Itf_dao_documento dao_documentoInterface) {
        this.daoDocumentoInterface = dao_documentoInterface;
    }

    public String agregarDocumentoBusiness(Cls_documento documento) throws TramiteDocuException {
        String Numero_docu;
        StringBuilder retorno = new StringBuilder();
        Map mp_documento = new HashMap();
        mp_documento.put(Cls_Parametros.Objeto_DOCUMENTO, documento);
        if (cls_utilitarios.areStringEquals(documento.getTipo_documento(), Cls_Parametros.TIPO_DOCUMENTO_RESOLUCION_GERENCIA_GENERAL)) {
            mp_documento.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_INSERTAR_DOCUMENTO_RESOLUCUION);
        } else {
            mp_documento.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_INSERTAR_DOCUMENTO);
        }
        retorno.append(this.daoDocumentoInterface.agregarDocumentoDao(mp_documento));
        if (!retorno.toString().startsWith("0-")){
            if (cls_utilitarios.areStringEquals(documento.getTipo_documento(), Cls_Parametros.TIPO_DOCUMENTO_EXTERNO)) {
                Numero_docu=retorno.toString().split("-")[1];
                documento.setNumero_documento(Long.parseLong(Numero_docu));
            }
            String mensaje_ubicacion_documento = cls_utilitarios.getMensajeRegistroDocumento(documento, TipoOperacionDocumentoEnum.REGISTRO);
            retorno = new StringBuilder(mensaje_ubicacion_documento).append(Cls_Parametros.CHARACTER_SEPARATOR_UNKNOW).append(retorno.toString().substring(1));
        }
        return retorno.toString();
    }

    public String actualizarDocumentoBusiness(Cls_documento documento) throws TramiteDocuException{
        StringBuilder retorno = new StringBuilder();
        Map mp_documento = new HashMap();
        if (cls_utilitarios.areStringEquals(documento.getTipo_documento(), Cls_Parametros.TIPO_DOCUMENTO_RESOLUCION_GERENCIA_GENERAL)) {
            mp_documento.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_MODIFICAR_DOCUMENTO_RESOLUCUION);
        } else {
            mp_documento.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_MODIFICAR_DOCUMENTO);
        }
        mp_documento.put(Cls_Parametros.Objeto_DOCUMENTO, documento);
        retorno.append(this.daoDocumentoInterface.agregarDocumentoDao(mp_documento));
        if (!retorno.toString().startsWith("0-")){
            String mensaje_ubicacion_documento = cls_utilitarios.getMensajeRegistroDocumento(documento, TipoOperacionDocumentoEnum.MODIFACION);
            if (retorno.indexOf("O") == 0 && cls_utilitarios.areNotStringEquals(documento.getTipo_documento(), Cls_Parametros.TIPO_DOCUMENTO_EXTERNO)) {
                retorno = new StringBuilder(mensaje_ubicacion_documento);
            }
        }
        return retorno.toString();
    }

    public boolean eliminarDocumentoBusiness(String codigo) {
        return this.daoDocumentoInterface.eliminarDocumentoDao(codigo);
    }

    public Cls_documento obtenerDocumentoConTodaInformacionBusiness(Map<String, String> map) throws TramiteDocuException {
        return this.daoDocumentoInterface.obtenerDocumentoConTodaInformacionDao(map);
    }

    private static ArrayList<Cls_documento> generarContenidoDeDocumentosPorFilasParaDatosGenerales(ArrayList<Cls_documento> array_documentos, Map<String, String> map) {
        ArrayList<Cls_documento> array_retorno = array_documentos;
        String codigos_seleccionados = (String) map.get(Cls_Parametros.Request_ARRAY_SELECCIONADO);
        StringBuffer html = new StringBuffer();
        String chk = "";
        for (Cls_documento documento : array_retorno) {
            html.setLength(0);
            String codigo = new Cls_Seguridad_DESBase64().encriptar(documento.obtenerCodigoConcatenado());
            if (map.get(Cls_Parametros.Map_FUNCION_HTML_LINK) == null || map.get(Cls_Parametros.Map_FUNCION_HTML_LINK).compareToIgnoreCase("6") == 0) {
                if (Cls_Validaciones.estaDocumentoSeleccionado(codigos_seleccionados, documento)) {
                     chk = "checked='Boolean.TRUE'";
                }
                String html_href = "docucheck_codigo='" + documento.getTipo_documento() + "|" + documento.getNumero_documento() + "|" + documento.getAnhio() + "|' " + "docucheck_nombre='" + documento.getCabecera() + "' " + "encripta_codigo='" + codigo + "'" + "class=" + (map.get(Cls_Parametros.Map_FUNCION_HTML_LINK) == null ? "'proyCheck_docu'" : "'proyCheck_proyecto'");
                html.append("<td><center><input type='checkbox' class=");
                html.append(map.get(Cls_Parametros.Map_FUNCION_HTML_LINK) == null ? "'proyCheck_docu'" : "'proyCheck_proyecto'");
                html.append(chk);
                html.append("docucheck_codigo='");
                html.append(documento.getTipo_documento()).append("|");
                html.append(documento.getNumero_documento()).append("|");
                html.append(documento.getAnhio()).append("|' ");
                html.append("docucheck_nombre='");
                html.append(documento.getCabecera());
                html.append("'></center></td>");
                documento.setCabecera("<a href='#!' " + html_href + " ><span>" + documento.getCabecera() + "</span></a>");
                documento.setAsunto("<a href='#!' " + html_href + " ><span>" + documento.getAsunto() + "</span></a>");
            } else {
                String html_href = "docucheck_codigo='" + documento.getTipo_documento() + "|" + documento.getNumero_documento() + "|" + documento.getAnhio() + "|' " + "docucheck_nombre='" + documento.getCabecera() + "' " + "encripta_codigo='" + codigo + "'" + "class='selDocument'";
                if (Integer.parseInt((String) map.get(Cls_Parametros.Map_FUNCION_HTML_LINK)) == Integer.parseInt("2")) {
                    html.append("<td><center><a href='#!'");
                    html.append(html_href);
                    html.append(">Visualizar</a></center></td>");
                    documento.setCabecera("<a href='#!' " + html_href + " ><span>" + documento.getCabecera() + "</span></a>");
                    documento.setFecha_creacion("<a href='#!' " + html_href + " ><span>" + documento.getFecha_ceacion() + "</span></a>");
                    documento.setAsunto("<a href='#!' " + html_href + " ><span>" + documento.getAsunto() + "</span></a>");
                    documento.setFecha_respuestaHref("<a href='#!' " + html_href + " ><span>" + documento.getFecha_respuesta() + "</span></a>");
                } else if (Integer.parseInt((String) map.get(Cls_Parametros.Map_FUNCION_HTML_LINK)) == Integer.parseInt("4")) {
                    html.append("<td><center><a href='#!' ");
                    html.append(html_href);
                    html.append("'>Permisos</a></center></td>");
                    documento.setCabecera("<a href='#!' " + html_href + " ><span>" + documento.getCabecera() + "</span></a>");
                    documento.setFecha_creacion("<a href='#!' " + html_href + " ><span>" + documento.getFecha_ceacion() + "</span></a>");
                    documento.setAsunto("<a href='#!' " + html_href + " ><span>" + documento.getAsunto() + "</span></a>");
                    documento.setFecha_respuestaHref("<a href='#!' " + html_href + " ><span>" + documento.getFecha_respuesta() + "</span></a>");
                    String htm_historial = "<a href='#!' codigo_alert='" + documento.obtenerCodigoConcatenadoRayita() + "' class='clickDocumAlert' title='Ver Historial'>" + "<span><img src='images/iconos/icono_history.png' width='20px' align='top'/></span></a>";
                    documento.setHistorial(htm_historial);
                } else {
                    html.append("<td><center><select><option value='PRESIDENTE'>PRESIDENTE</option><option value='MIEMBRO'>MIEMBRO</option></select></center></td>");
                }
            }
            chk = "";
            documento.setOpciones(html.toString()); 
        }
        return array_retorno;
    }

    public ArrayList<Cls_documento> obtenerTodosDocumentoBusiness(Map<String, String> map) {
        map.put(Cls_Parametros.Map_ESTADO_DOCUMENTO, "%%");
        map.put(Cls_Parametros.Map_DNI, "%%");
        ArrayList array_retorno = this.daoDocumentoInterface.obtenerTodosDocumentoDao(map);
        return generarContenidoDeDocumentosPorFilasParaDatosGenerales(array_retorno, map);
    }

    public ArrayList<Cls_documento> obtenerTodosDocumentoProyectosPendientesBusiness(Map<String, String> map) {
        map.put(Cls_Parametros.Map_ESTADO_DOCUMENTO, "%005%");
        ArrayList array_retorno = this.daoDocumentoInterface.obtenerTodosDocumentoDao(map);
        return generarContenidoDeDocumentosPorFilasParaDatosGenerales(array_retorno, map);
    }

    public int obtenerCantidadDeRegistrosBussiness(Map<String, String> map) {
        return this.daoDocumentoInterface.obtenerCantidadDeRegistrosDao(map);
    }

    public JasperPrint obtenerDocumentoPrintBusiness(Map<String, String> map) {
        return this.daoDocumentoInterface.obtenerDocumentoPrintDao(map);
    }

    public ArrayList<Cls_documento> obtenerTodosDocumentoPersonalesDeAreaBusiness(Map<String, String> map) {
        ArrayList array_retorno = (ArrayList) this.daoDocumentoInterface.obtenerTodosDocumentoPersonalesDao(map);
        return generarContenidoDeDocumentosPorFilasParaDatosGenerales(array_retorno, map);
    }

    public ArrayList<Cls_Bandeja_Documento> obtenerTodosDocumentoPersonalesBusiness(Map<String, String> map) {
        if (((String) map.get(Cls_Parametros.Request_NOMBRE_COLUMNA)).compareToIgnoreCase("2") == 0) {
            map.put(Cls_Parametros.Map_NUMERO_DOCUMENTO, map.get(Cls_Parametros.Request_DATO_A_BUSCAR_POSTGREST));
            map.put(Cls_Parametros.Map_DNI_CONSULTA, "%%");
        } else if (((String) map.get(Cls_Parametros.Request_NOMBRE_COLUMNA)).compareToIgnoreCase("1") == 0) {
            map.put(Cls_Parametros.Map_DNI_CONSULTA, map.get(Cls_Parametros.Request_DATO_A_BUSCAR_POSTGREST));
            map.put(Cls_Parametros.Map_NUMERO_DOCUMENTO, "%%");
        }
        String codigo_dni = (String) map.get(Cls_Parametros.Map_DNI);
        String html = "";
        String html_href = "";
        ArrayList<Cls_Bandeja_Documento> array = (ArrayList<Cls_Bandeja_Documento>) this.daoDocumentoInterface.obtenerTodosDocumentoPersonalesDao(map);
        for (Cls_Bandeja_Documento documento : array) {
            String codigo_01 = documento.obtenerCodigoConcatenado();
            String codigo_02 = documento.obtenerCodigoConcatenadoRayita();
            String codigo_03 = new Cls_Seguridad_DESBase64().encriptar(codigo_01);

            html_href = "ref_codigo='" + codigo_01 + "-" + codigo_dni + "-" + cls_utilitarios.cambiarOrdenFechaDeSqlParaConsultaSql(documento.getFecha_ceacion()) + "-" + documento.getHora() + "-" + documento.getCodigo().trim() + "'" + "ref_codigo_01='" + codigo_02 + "'" + "ref_codigo_03='" + codigo_03 + "'" + "ref_cabecera='" + documento.getCabecera() + "'" + "class='clickDocum' ";

            documento.setCabecera(((Integer.parseInt(documento.getCantidad_mensajes().trim()) < 999) && (("" + (String) map.get(Cls_Parametros.Request_ARRAY_SELECCIONADO)).compareToIgnoreCase("P") == 0) ? "<a href='#!' codigo_alert='" + codigo_02 + "' class='clickDocumAlert' title='Click Para Ver Detalle'>" + "<span>(" + documento.getCantidad_mensajes().trim() + ")<img src='css/images/important.gif' width='15px' align='top'/></span></a>" : new StringBuilder().append("<a href='#!' codigo_alert='").append(codigo_02).append("' class='clickDocumAlert' title='Click Para Ver Detalle'>").append("<span><img src='images/iconos/buscar_unidad.png' width='15px' align='top'/></span></a>").toString()) + " - <a href='#!' " + html_href + "><span>" + documento.getCabecera() + "</span></a>");

            documento.setCargo("<a href='#!' " + html_href + " ><span>" + documento.getCargo() + "</span></a>");
            documento.setFecha_creacion("<a href='#!' " + html_href + "><span>" + documento.getFecha_ceacion() + "</span></a>");
            documento.setHora("<a href='#!' " + html_href + "><span>" + documento.getHora() + "</span></a>");
            documento.setNombres("<a href='#!' " + html_href + "><span>" + documento.getNombres() + "</span></a>");
            html = "<td><center><a href='#'" + html_href + ">" + "Visualizar" + "</a>" + "</center>" + "</td>";
            documento.setOpciones(html);
        }
        return array;
    }

    public int obtenerCantidadDeDocumentosPersonalesDao(Map<String, String> map) {
        return this.daoDocumentoInterface.obtenerCantidadDeDocumentosPersonalesDao(map);
    }

    public Cls_Bandeja_Documento obtenerDocumentoPersonalBandejaBusiness(Map<String, String> map, Cls_Trabajador trabajador) throws TramiteDocuException {
        Cls_Trabajador trabajadorDeSession = trabajador;
        Cls_Bandeja_Documento documento = this.daoDocumentoInterface.obtenerDocumentoPersonalBandejaDao(map);
        String codigo_accion = documento.getMotivo();
        String codigoAccionRealizada = "";
        Cls_Trabajador trabajadorEmisorDocumento=null;
        String[] parametrosParaFacade_01 = {Cls_Parametros.Map_TIPO_DOCUMENTO, documento.getTipo_documento()};
        String[] parametrosParaFacade_02 = {Cls_Parametros.Map_NUMERO_DOCUMENTO, "" + documento.getNumero_documento()};
        String[] parametrosParaFacade_03 = {Cls_Parametros.Map_ANHIO_DOCUMENTO, documento.getAnhio()};
        Map map_datos_documento = cls_utilitarios.generarHashMapParaRequest(parametrosParaFacade_01, parametrosParaFacade_02, parametrosParaFacade_03);
        Cls_documento documento_con_toda_informacion = obtenerDocumentoConTodaInformacionBusiness(map_datos_documento);
        try {
            codigoAccionRealizada = codigo_accion.split("-")[0].trim();
        } catch (NullPointerException ex) {
            
        }
        try {
            if (cls_utilitarios.areStringEquals(map.get(Cls_Parametros.Map_FILTRO), Cls_Parametros.BUSQUEDAD_BANDEJA_PENDIENTE)) {
                documento.setPuede_disparar_para_firma(Boolean.TRUE);
                String[] parametrosParaFacade_05 = {Cls_Parametros.Map_DNI, documento.getCodigo()};
                
                trabajadorEmisorDocumento = Cls_InvocaWebService.validarLoginRRHHWs(cls_utilitarios.generarHashMapParaRequest(parametrosParaFacade_05)).get(0);
                    
                if ((!documento.isIsProyectado())
                        && !cls_utilitarios.areStringEquals(codigoAccionRealizada, Cls_Parametros.MOTIVO_ASIGNACION_DE_PERMISOS_PARA_IMPRIMIR_DOCUMENTO)
                        && !cls_utilitarios.areStringEquals(codigoAccionRealizada, Cls_Parametros.MOTIVO_ASIGNACION_DE_PERMISOS_PARA_MODIFICAR_DOCUMENTO)) {
                    if (!cls_utilitarios.areStringEquals(documento.getUsuario_crea_documento(), trabajadorDeSession.getCodigo())) {
                        documento.setPuede_atender(Boolean.TRUE);
                    }
                    documento.setPuede_disparar_para_firma(Boolean.FALSE);
                    documento.setPuede_responder(Boolean.TRUE);
                    documento.setTipo_usuario("" + trabajadorEmisorDocumento.getTipo_usuario_area());
                    documento.setPuede_derivar(Boolean.TRUE);
                } else if ((cls_utilitarios.areStringEquals(codigoAccionRealizada, Cls_Parametros.MOTIVO_ASIGNACION_DE_PERMISOS_PARA_IMPRIMIR_DOCUMENTO))
                        || (cls_utilitarios.areStringEquals(codigoAccionRealizada, Cls_Parametros.MOTIVO_ASIGNACION_DE_PERMISOS_PARA_MODIFICAR_DOCUMENTO))) {
                    documento.setTiene_permisos(Boolean.TRUE);
                    if (cls_utilitarios.areStringEquals(codigoAccionRealizada, Cls_Parametros.MOTIVO_ASIGNACION_DE_PERMISOS_PARA_IMPRIMIR_DOCUMENTO)) {
                        documento.setTiene_permisos_impresion(Boolean.TRUE);
                    } else if (cls_utilitarios.areStringEquals(codigoAccionRealizada, Cls_Parametros.MOTIVO_ASIGNACION_DE_PERMISOS_PARA_MODIFICAR_DOCUMENTO)) {
                        documento.setPuede_modificar(Boolean.TRUE);
                    }
                } else {
                    if (cls_utilitarios.areStringEquals(trabajadorDeSession.getCodigo(), documento.getUsuario_crea_documento())) {
                        documento.setPuede_modificar(Boolean.TRUE);
                    }
                    if (Cls_Validaciones.elUsuarioIsJefe(trabajadorDeSession)) {
                        if (cls_utilitarios.areStringEquals(trabajadorDeSession.getCodigo(), documento.getFirma())) {
                            documento.setPuede_firmar_cerrar_documento(Boolean.TRUE);
                            documento.setPuede_disparar_para_firma(Boolean.FALSE);
                        }

                        if (documento.getFecha_cierre().length() == 1) {
                            if (cls_utilitarios.areStringEquals(documento.getCodigo_area_crea_documento(), trabajadorDeSession.getCodigo_area())) {
                                documento.setPuede_modificar_visto(Boolean.TRUE);
                                documento.setPuede_derivar_modificar(Boolean.TRUE);

                                if (documento.isSolicito_visto()) {
                                    //para que el jefe de area puedamodificar
                                    documento.setPuede_disparar_para_firma(Boolean.FALSE);
                                    documento.setPuede_modificar_visto(Boolean.FALSE);
                                    documento.setPuede_derivar_modificar(Boolean.FALSE);
                                    documento.setPuede_firmar_cerrar_documento(Boolean.FALSE);                                    
                                }                   
                                
                                //LOGICA PARA LOS VISTOS BUENOS
                                documento.setRespuesta_vistos(obtenerVistoDocumentoBusiness(map_datos_documento));
                                if(documento.getRespuesta_vistos().size()>=1){
                                    boolean podriaTenerTodosVistosAceptados = Boolean.FALSE;
                                    for (Cls_Visto vistos_documento : documento.getRespuesta_vistos()) {
                                        if(vistos_documento.isVistoVacio()){
                                            documento.setPuede_disparar_para_firma(Boolean.FALSE);
                                            continue;
                                        }else if (vistos_documento.isRechazaVisto()){
                                            documento.setPuede_disparar_para_firma(Boolean.FALSE);
                                            podriaTenerTodosVistosAceptados = Boolean.FALSE;
                                            documento.setTiene_vistos_rechazados(Boolean.TRUE);
                                            break;
                                        }else{
                                            podriaTenerTodosVistosAceptados = Boolean.TRUE;
                                        }
                                    }
                                    //Si tiene todos los vistos aceptados, Ya no deberia Volver 
                                    //a enviar solicitud de vistos Salvo se 
                                    //agregue una nueva unidad organica para que de su visto
                                    documento.setPuede_disparar_para_vto_bno(!podriaTenerTodosVistosAceptados);
                                }     
                                if (documento.isPuede_disparar_para_vto_bno() || documento.isPuede_disparar_para_firma()) {
                                    documento.setPuede_firmar_cerrar_documento(Boolean.FALSE);
                                }
                                //FIN - LOGICA PARA LOS VISTOS BUENOS

                            }else if(trabajadorDeSession.isJefeInmediatoDe(trabajadorEmisorDocumento)){//Siendo los 2 jefes
                                documento.setPuede_derivar_modificar(Boolean.TRUE);
                            }
                            //se modifico logica para que jefe inmedito pueda dar visto bueno
                            if (documento_con_toda_informacion.existeCodigoAreaEnVistoArray(trabajadorDeSession.getCodigo_area())) {
                                if (cls_utilitarios.areNotStringEquals(
                                        documento_con_toda_informacion.obtenerEstadoVistoEnVistoArray(trabajadorDeSession.getCodigo_area()),Cls_Parametros.CHECK_ACCEPT)) {
                                                documento.setPuede_dar_vto_bno(Boolean.TRUE);
                                                documento.setPuede_disparar_para_firma(Boolean.FALSE);
                                }
                            }

                        } else {
                            documento.setPuede_derivar(Boolean.TRUE);
                            for (Cls_documento_destinatario destinatarios : documento_con_toda_informacion.getDestinatarios()) {
                                if (cls_utilitarios.areStringEquals(destinatarios.getCodigo(),trabajadorDeSession.getCodigo()) &&
                                  (!destinatarios.isPuede_atender())) {
                                    documento.setPuede_atender(Boolean.TRUE);
                                    break;
                                }
                            }
                        }
                    }else{
                        documento.setPuede_disparar_para_firma(Boolean.FALSE);
                    }
                    if (documento.getFecha_cierre().length() != 1) {
                        documento.setPuede_derivar(Boolean.TRUE);
                        for (Cls_documento_destinatario destinatarios : documento_con_toda_informacion.getDestinatarios()) {
                            if ((destinatarios.getCodigo().trim().compareToIgnoreCase(trabajadorDeSession.getCodigo().trim()) == 0) && (!destinatarios.isPuede_atender())) {
                                documento.setPuede_atender(Boolean.TRUE);
                                break;
                            }
                        }
                    }
                }

            } else if (cls_utilitarios.areStringEquals(map.get(Cls_Parametros.Map_FILTRO),Cls_Parametros.BUSQUEDAD_BANDEJA_EN_SEGUIMIENTO)) {
                documento.setPuede_atender(Boolean.TRUE);
                documento.setReiterar_solicitud(Boolean.TRUE);
            }
        } catch (NullPointerException ex) {
            if(trabajadorEmisorDocumento==null){
                return null;
            }
            Logger.getLogger(Cls_business_documento.class.getName()).log(Level.SEVERE, null, ex);
            throw new TramiteDocuException(ex.getClass().getSimpleName());
        }
        documento.setDescripcionDocumento(cls_utilitarios.getMensajeParaDescripcionBandeja(documento_con_toda_informacion));
        return documento;
    }

    public String actualizarBandejaDocumentoBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_ATENDER_DOCUMENTO);
        return this.daoDocumentoInterface.actualizarBandejaDocumentoDao(map);
    }

    public String reiniciarContadorMensajesBandejaDocumentoBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_REINICIAR_CONTADOR_MENSAJES_DOCUMENTO);
        return this.daoDocumentoInterface.actualizarBandejaDocumentoDao(map);
    }

    public String agregarHistorialDocumentoBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_INSERTAR_HISTORIAL_DOCUMENTO);
        return this.daoDocumentoInterface.agregarHistorialDocumentoDao(map);
    }

    public String delegarDocumentoDesdeBandejaBusiness(Map<String, String> map) throws TramiteDocuException {
        if (cls_utilitarios.areStringEquals((String) map.get(Cls_Parametros.Map_TIPO_DERIVACION), Cls_Parametros.MOTIVO_CONOCIMIENTO_Y_FINES)) {
            map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DELEGA_DOCUMENTO);
        } else {
            map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DELEGA_DOCUMENTO_MULTIPLE);
        }
        return this.daoDocumentoInterface.delegarDocumentoDesdeBandejaDao(map);
    }

    public boolean necesitaGenerarFlashBusiness(Map<String, String> map) {
        return this.daoDocumentoInterface.necesitaGenerarFlashDao(map);
    }

    public String agregarDocumentoExtensionBusiness(Map<String, Object> mp_extensiones) {
        mp_extensiones.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_INSERTAR_DOCUMENTO_EXTENSION);
        return this.daoDocumentoInterface.mantenimientoExtensionDao(mp_extensiones);
    }

    public String dipararDocumentoDesdeBandejaParaVistoBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DISPARAR_DOCUMENTO);
        map.put(Cls_Parametros.Map_PARAMETRO_APROBAR, "BANDEJA");
        return this.daoDocumentoInterface.dipararDocumentoDesdeBandejaParaVistoDao(map);
    }

    public String dipararDocumentoDesdeBandejaParaVistoRechazadosBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DISPARAR_DOCUMENTO_VISTOS_RECHAZADOS);
        map.put(Cls_Parametros.Map_PARAMETRO_APROBAR, map.get(Cls_Parametros.Map_DESTINATARIOS));
        return this.daoDocumentoInterface.dipararDocumentoDesdeBandejaParaVistoDao(map);
    }

    public String darVistoDocumentoDesdeBandejaParaRespuestaBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DAR_VISTO_DOCUMENTO);
        return this.daoDocumentoInterface.darVistoDocumentoDesdeBandejaParaRespuestaDao(map);
    }

    public ArrayList<Cls_Documento_Historial> obtenerHistorialDocumentoBusiness(Map<String, String> parametros) throws TramiteDocuException{
        return this.daoDocumentoInterface.obtenerHistorialDocumentoDao(parametros);
    }
    public int obtenerCantidadHistorialBusiness(Map<String, String> map) throws TramiteDocuException{
        return this.daoDocumentoInterface.obtenerCantidadHistorialDao(map);
    }


    public ArrayList<Cls_Visto> obtenerVistoDocumentoBusiness(Map<String, Object> documento) throws TramiteDocuException {
        return this.daoDocumentoInterface.obtenerVistoDocumentoDao(documento);
    }

    public String cerrarDocumentoBusiness(Map<String, Object> mp_documento) {
        Cls_documento documento = (Cls_documento) mp_documento.get(Cls_Parametros.Map_OBJETO_DOCUMENTO);
        if (documento.isIsProyectado()) {
            mp_documento.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_ASIGNAR_CORRELATIVO_DOCUMENTO);
            this.daoDocumentoInterface.AsignarCorrelativoADocumentoDao(mp_documento);
        }
        mp_documento.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_CERRAR_DOCUMENTO_EXTENSION);
        return this.daoDocumentoInterface.cerrarDocumentoDao(mp_documento);
    }

    public int puedeImprimirDocumentoBusiness(Map<String, String> map) {
        return this.daoDocumentoInterface.puedeImprimirDocumentoDao(map);
    }

    public String aprobarDocumentoBusiness(Map<String, Object> mp_empresa) throws TramiteDocuException {
        mp_empresa.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_APROBAR_DOCUMENTO);
        mp_empresa.put(Cls_Parametros.Map_PARAMETRO_APROBAR, "BANDEJA");
        return this.daoDocumentoInterface.aprobarDocumentoDao(mp_empresa);
    }

    public ArrayList<Cls_Notificaciones> obtenerNotificacionesBusiness(Map<String, String> map) {
        return this.daoDocumentoInterface.obtenerNotificacionesDao(map);
    }

    public String actualizarDocumentoVistoBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DOCUMENTO_ACTUALIZAR_VISTO);
        return this.daoDocumentoInterface.actualizarDocumentoVistoDao(map);
    }

    public String darPermisosImprimirBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DOCUMENTO_DAR_PERMISOS_IMPRESION);
        return this.daoDocumentoInterface.darPermisosImprimirDao(map);
    }

    public String darPermisosModificarBusiness(Map<String, String> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_DOCUMENTO_DAR_PERMISOS_MODIFICAR);
        return this.daoDocumentoInterface.darPermisosImprimirDao(map);
    }

    public int obtenerCantidadDeDocumentosPersonalesAreaBusiness(Map<String, String> map) {
        return this.daoDocumentoInterface.obtenerCantidadDeDocumentosPersonalesDao(map);
    }

    public ArrayList<Cls_Bandeja_destinatarios_derivacion> obtenerDestinatariosDeDerivacionBusiness(Map<String, String> map) throws TramiteDocuException {
        ArrayList array_destinatarios = this.daoDocumentoInterface.obtenerDestinatariosDeDerivacionDao(map);
        return array_destinatarios;
    }

    public String agregarBorradorBusiness(Map<String, Object> map) throws TramiteDocuException {
        map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_BORRADOR_INSERTAR);
        return this.daoDocumentoInterface.agregarBorradorDao(map);
    }

    public String eliminarPositBorradorDeBandejaBusiness(Map<String, Object> mp_documento) {
        return this.daoDocumentoInterface.eliminarPositBorradorDeBandejaDao(mp_documento);
    }

    public ArrayList<String> obtenerAños() {
        return this.daoDocumentoInterface.obtenerAños();
    }

    public Cls_documento obtenerCabeceraHistorialDocumentoBusiness(Map<String, String> paramMap) throws TramiteDocuException {
        return this.daoDocumentoInterface.obtenerCabeceraHistorialDocumentoDao(paramMap); 
    }
}
